<?php

namespace App\Repositories;

use App\Models\DictIp;
use Exception;

class DictIpRepository
{
    public function getIpAddress($ip = '')
    {
        $datatype = 'json';
        $url = 'https://api.ip138.com/ip/?ip=' . $ip . '&datatype=' . $datatype;
        // $header = array('token:'.C('ip_138_token'));
        $header = array('token:0bf26634941677d387594b7d6ef14101');
        return $this->curlGet($url, $header);
    }

    //获取ip地区
    public function getIpRegion($ip, $type = false)
    {
        if (!isset($ip) || empty($ip)) {
            return '';
        }
        $citys = array('北京', '上海', '天津', '重庆');
        $ips = DictIp::where('ip', "=", $ip)->first();
        if ($ips) {
            if ($ips['country'] != '中国') {
                return $ips['country'];// 外国ip直接显示国家名称
            }
            if (in_array($ips['province'], $citys)) {
                if ($type)
                    return ['city' => $ips['province']];

                return $ips['province'];// 国内直辖市显示市
            } else {
                if ($type)
                    return ['city' => $ips['city']];
                return $ips['province'] . $ips['city'];// 其他显示省市
            }
        } else {

            // https://api.vore.top/api/IPdata?ip=117.136.12.79
            // https://ip.useragentinfo.com/json?ip=117.136.12.79
            $addr = getIPAddress($ip, 3);
            if(is_array($addr)){
                $res = [
                    'country' => $addr['nation'] ?? "",
                    'province' => str_replace("省","", $addr['province'] ?? ""),
                    'city' => str_replace("市","", $addr['city'] ?? ""),
                    'area' => $addr['district'] ?? "",
                ];
            }else{
                $arr = explode(' ', $addr);
                $res = $this->handleAddress($arr[0]);
            }

            $add['ip'] = $ip;
            $add['country'] = $res['country'] ?? '';
            $add['province'] = $res['province'] ?? '';
            $add['city'] = $res['city'] ?? '';
            $add['area'] = $res['area'] ?? '';
            $add['operator'] = $arr[1] ?? '';
            $add['create_time'] = time();
            DictIp::insert($add);

            if ($res['country'] != '中国') {
                return $res['country'];
            } else {
                if (in_array($res['province'], $citys)) {

                    if ($type)
                        return ['city' => $res['province']];

                    return $res['province'];// 国内直辖市显示市
                } else {
                    if ($type)
                        return ['city' => $res['city']];
                    return $res['province'] . $res['city'];// 其他显示省市
                }
            }
        }
    }

    public function handleAddress($address)
    {
        $province = ['江苏', '浙江', '安徽', '北京', '天津', '上海', '重庆', '河北', '山西', '辽宁', '吉林', '黑龙江', '福建', '江西', '山东', '河南', '湖北', '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '内蒙古', '广西', '西藏', '宁夏', '新疆', '香港', '澳门'];

        $city = ['北京', '上海', '天津', '重庆', '南京', '镇江', '常州', '无锡', '苏州', '徐州', '连云港', '淮安', '盐城', '扬州', '泰州', '南通', '宿迁', '合肥', '蚌埠', '芜湖', '淮南', '亳州', '阜阳', '淮北', '宿州', '滁州', '安庆', '巢湖', '马鞍山', '宣城', '黄山', '池州', '铜陵', '杭州', '嘉兴', '湖州', '宁波', '金华', '温州', '丽水', '绍兴', '衢州', '舟山', '台州', '济南', '青岛', '淄博', '枣庄', '东营', '烟台', '潍坊', '济宁', '泰安', '威海', '日照', '莱芜', '临沂', '德州', '聊城', '菏泽', '滨州', '广州', '深圳', '汕头', '惠州', '珠海', '揭阳', '佛山', '河源', '阳江', '茂名', '湛江', '梅州', '肇庆', '韶关', '潮州', '东莞', '中山', '清远', '江门', '汕尾', '云浮', '长沙', '株洲', '湘潭', '衡阳', '岳阳', '郴州', '永州', '邵阳', '怀化', '常德', '益阳', '张家界', '娄底', '武汉', '襄樊', '宜昌', '黄石', '鄂州', '随州', '荆州', '荆门', '十堰', '孝感', '黄冈', '咸宁', '郑州', '洛阳', '开封', '漯河', '安阳', '新乡', '周口', '三门峡', '焦作', '平顶山', '信阳', '南阳', '鹤壁', '濮阳', '许昌', '商丘', '驻马店', '太原', '大同', '忻州', '阳泉', '长治', '晋城', '朔州', '晋中', '运城', '临汾', '吕梁', '贵阳', '六盘水', '遵义', '安顺', '成都', '绵阳', '德阳', '广元', '自贡', '攀枝花', '乐山', '南充', '内江', '遂宁', '广安', '泸州', '达州', '眉山', '宜宾', '雅安', '资阳', '石家庄', '唐山', '邯郸', '秦皇岛', '保定', '张家口', '承德', '廊坊', '沧州', '衡水', '邢台', '哈尔滨', '大庆', '齐齐哈尔', '佳木斯', '鸡西', '鹤岗', '双鸭山', '牡丹江', '伊春', '七台河', '黑河', '绥化', '长春', '吉林', '四平', '辽源', '通化', '白山', '松原', '白城', '沈阳', '大连', '鞍山', '抚顺', '本溪', '丹东', '锦州', '营口', '阜新', '辽阳', '盘锦', '铁岭', '朝阳', '葫芦岛', '福州', '厦门', '泉州', '三明', '南平', '漳州', '莆田', '宁德', '龙岩', '海口', '三亚', '昆明', '曲靖', '玉溪', '保山', '昭通', '丽江', '普洱', '临沧', '西安', '咸阳', '铜川', '延安', '宝鸡', '渭南', '汉中', '安康', '商洛', '榆林', '兰州', '天水', '平凉', '酒泉', '嘉峪关', '金昌', '白银', '武威', '张掖', '庆阳', '定西', '陇南', '南昌', '九江', '赣州', '吉安', '鹰潭', '上饶', '萍乡', '景德镇', '新余', '宜春', '抚州', '南宁', '柳州', '桂林', '梧州', '北海', '崇左', '来宾', '贺州', '玉林', '百色', '河池', '钦州', '防城港', '贵港', '乌鲁木齐', '克拉玛依', '石河子', '阿拉尔', '图木舒克', '五家渠', '哈密', '吐鲁番', '阿克苏', '喀什', '和田', '伊宁', '塔城', '阿勒泰', '奎屯', '博乐', '昌吉', '阜康', '库尔勒', '阿图什', '乌苏', '拉萨', '银川', '石嘴山', '吴忠', '固原', '中卫', '呼和浩特', '包头', '乌海', '赤峰', '通辽', '鄂尔多斯', '呼伦贝尔', '巴彦淖尔', '乌兰察布', '霍林郭勒', '满洲里', '牙克石', '扎兰屯', '根河', '额尔古纳', '丰镇市', '锡林浩特', '二连浩特', '乌兰浩特', '阿尔山市', '西宁'];

        if (!is_str_has($address, '中国')) {
            $res['country'] = $address;
            return $res;
        } else {
            $res['country'] = '中国';
        }

        foreach ($province as $k => $v) {
            if (is_str_has($address, $v)) {
                $res['province'] = $v;
                break;
            }
        }
        foreach ($city as $k => $v) {
            if (is_str_has($address, $v)) {
                $res['city'] = $v;
                break;
            }
        }

        $area = str_replace($res['country'] . $res['province'] . $res['city'], '', $address);
        if (!empty($area)) {
            $res['area'] = $area;
        }

        return $res;
    }


    public function curlGet($url, $header)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
        $handles = curl_exec($ch);
        curl_close($ch);
        return $handles;
    }

}